#ifndef MQTTMANAGER_H
#define MQTTMANAGER_H

#include <QObject>
#include <QTcpSocket>
#include <QTimer>
#include <QDateTime>
#include "models/mqttconfig.h"

/**
 * @brief MQTT管理类（业务层）- 基于巴法云TCP协议
 * 
 * 职责：
 * 1. 管理TCP连接到巴法云服务器
 * 2. 实现巴法云消息协议（订阅、发布、心跳）
 * 3. 处理设备控制逻辑（风扇、温度）
 * 4. 自动重连和心跳维持
 * 5. 消息解析和状态管理
 * 
 * 特点：
 * - 独立于UI，可以被任何界面使用
 * - 通过信号槽与UI通信
 * - 实现巴法云TCP协议规范
 */
class MqttManager : public QObject
{
    Q_OBJECT

public:
    explicit MqttManager(QObject *parent = nullptr);
    ~MqttManager();

    // 连接管理
    bool connectToServer(const MqttConfig &config);
    void disconnectFromServer();
    bool isConnected() const;
    
    // 主题订阅
    bool subscribeTopic(const QString &topic);
    bool subscribeTopics(const QStringList &topics);
    
    // 消息发布
    bool publishMessage(const QString &topic, const QString &msg);
    bool publishWithSet(const QString &topic, const QString &msg);  // 使用/set后缀
    bool publishWithUp(const QString &topic, const QString &msg);   // 使用/up后缀
    
    // 设备控制（业务逻辑）
    bool setFanMode(bool manual);           // 设置模式：false=自动(M0), true=手动(M1)
    bool setFanSpeed(int speed);            // 设置风扇档位：0-3 (S0-S3)
    bool publishTemperature(double temp);   // 发布温度数据
    
    // 历史消息
    bool getHistoryMessage(const QString &topic);
    
    // 服务器时间
    bool requestServerTime(int type = 1);   // 1=日期时间, 2=时间, 3=时间戳
    
    // 获取当前配置和状态
    MqttConfig getConfig() const { return m_config; }
    QString getErrorString() const { return m_lastError; }
    QString getConnectionStatus() const;
    
    // 统计信息
    quint64 getSentCount() const { return m_sentCount; }
    quint64 getReceivedCount() const { return m_receivedCount; }
    void clearStatistics();

signals:
    // 连接状态信号
    void connected();
    void disconnected();
    void errorOccurred(const QString &error);
    void connectionStatusChanged(const QString &status);
    
    // 消息接收信号
    void messageReceived(const QString &topic, const QString &msg);
    void rawDataReceived(const QString &data);
    
    // 设备状态信号
    void fanModeChanged(bool manual);       // 模式改变：false=自动, true=手动
    void fanSpeedChanged(int speed);        // 风扇档位改变：0-3
    void temperatureReceived(double temp);  // 接收到温度数据
    
    // 协议响应信号
    void subscribeSuccess(const QString &topic);
    void publishSuccess(const QString &topic);
    void serverTimeReceived(const QString &time);
    
    // 统计信息信号
    void statisticsUpdated(quint64 sent, quint64 received);

private slots:
    void onConnected();
    void onDisconnected();
    void onReadyRead();
    void onError(QAbstractSocket::SocketError error);
    void onHeartbeatTimeout();
    void onReconnectTimeout();

private:
    // 协议实现
    void sendCommand(const QString &cmd);
    void parseResponse(const QString &response);
    void parseKeyValue(const QString &data, QMap<QString, QString> &result);
    
    // 心跳和重连
    void startHeartbeat();
    void stopHeartbeat();
    void startReconnect();
    void stopReconnect();
    
    // 工具方法
    QString buildSubscribeCmd(const QStringList &topics);
    QString buildPublishCmd(const QString &topic, const QString &msg);
    QString buildHistoryCmd(const QString &topic);
    QString buildTimeCmd(int type);
    QString buildHeartbeatCmd();

private:
    QTcpSocket *m_socket;           // TCP连接
    MqttConfig m_config;            // 配置信息
    
    QTimer *m_heartbeatTimer;       // 心跳定时器
    QTimer *m_reconnectTimer;       // 重连定时器
    
    QString m_receiveBuffer;        // 接收缓冲区
    QString m_lastError;            // 最后的错误信息
    
    bool m_isManualDisconnect;      // 是否手动断开连接
    
    // 统计信息
    quint64 m_sentCount;            // 发送消息数
    quint64 m_receivedCount;        // 接收消息数
    
    // 已订阅的主题列表
    QStringList m_subscribedTopics;
};

#endif // MQTTMANAGER_H

